vue-element-admin下載到登錄的一些坑
快速上手
官方文檔:https://panjiachen.github.io/vue-element-admin-site/zh/guide/
啟動項目
拉取代碼之后進行npm i 安裝
ctrl -c 之后
執(zhí)行命令:git config --global url.“https://”.insteadOf git:// 重新 npm i 成功! npm run dev 啟動成功
依賴下載成功截圖
另外npm i之后也可能會發(fā)現(xiàn)其他的報錯
具體哪些就不一一列舉了,我這邊node版本 v10.20.0 ,npm版本6.14.4
這里列舉 是因為之前有報錯發(fā)現(xiàn)要升級npm版本下載依賴,有個core.js很難下載。
下載固定npm指令: npm install npm@6.14.4 -g
node的話nvm隨便下載就好了
啟動成功
登錄流程解析
1.目錄結構
重要文件
permission.js
登錄流程中,src/permission.js是最重要的環(huán)節(jié),這個文件是路由的全局鉤子(beforeEach和afterEach),全局鉤子的意思就是每次跳轉的時候可以根據(jù)情況進行攔截,不讓他跳轉。使用場景就是有些頁面需要登錄才能訪問,這時候就可以在beforeEach中校驗用戶登錄狀態(tài)來進行攔截。
utils/auth.js
設置token到cookie中的操作封裝。
router
有關路由的一些設置
登錄流程解析
1.登錄頁面:view/login/index.vue
點擊登錄按鈕后,觸發(fā)handleLogin方法,利用validate進行表單驗證,如果驗證通過,調(diào)用user/login方法傳遞表單里的數(shù)據(jù),根據(jù).then回調(diào)執(zhí)行this.$router.push方法,這個方法用于跟蹤:我是從哪里跳到/login頁面的,登錄后我就返回哪里。
2./user/login方法:src/store/modules/user.js
這個方法主要做了以下工作:登錄驗證,登錄成功后,分別把token保存在vuex和cookie中。
3.permission.js :src/permission.js
router.beforeEach(async(to, from, next) => { // 從cookie中取得token const hasToken = getToken() // 如果有token 也就是已經(jīng)登陸的情況下 if (hasToken) { // 并且要前往的路徑是'/login' 則返回 '/' if (to.path === '/login') { next({ path: '/' }) } else { // 從store中取得用戶的 roles, 也就是用戶的權限 并且用戶的權限數(shù)組必須有一個以上 const hasRoles = store.getters.roles && store.getters.roles.length > 0 // 有權限則直接進入 if (hasRoles) { next() } else { // 沒有權限的話 try { // 獲取用戶信息 const { roles } = await store.dispatch('user/getInfo') // 生成可訪問路由 const accessRoutes = await store.dispatch('permission/generateRoutes', roles) // 將可訪問路由添加到路由上 router.addRoutes(accessRoutes) // 進入路由 next({ ...to, replace: true }) } catch (error) { // 如果出現(xiàn)異常 清空路由 await store.dispatch('user/resetToken') // Message提示錯誤 Message.error(error || 'Has Error') // 跳到login頁面重新登陸 next(`/login?redirect=${to.path}`) } } } } else { // 沒有token 也就是沒有登陸的情況下 // 判斷是否是白名單(也就是說不需要登陸就可以訪問的路由) if (whiteList.indexOf(to.path) !== -1) { next() } else { // 其他的一律給我跳到login頁面 老老實實的進行登陸 next(`/login?redirect=${to.path}`) NProgress.done() } } })
利用beforeEach進行訪問攔截,如果沒登錄,跳轉到登錄頁面進行登錄。
4.user/getInfo:src/store/modules/user.js
getInfo用于獲取用戶信息并保存到vuex中,后面是一堆的數(shù)據(jù)校驗。
5.permission/generateRoutes:src/store/modules/permission.js
// 判斷是否有權限 function hasPermission(roles, route) { if (route.meta && route.meta.roles) { // roles.some => Array.some 相當于是只要有一個滿足就為true // 判斷用戶的權限于當前路由訪問所需要的權限是否有一個滿足 // 比如說用戶權限為 ['one','two'] 當前路由訪問所需要權限為 ['two','three'] 那么就說明當前用戶可以訪問這個路由 return roles.some(role => route.meta.roles.includes(role)) } else { // 默認是可訪問的 return true } } // 生成可訪問路由 export function filterAsyncRoutes(routes, roles) { const res = [] routes.forEach(route => { const tmp = { ...route } // 判斷當前路由是否可以訪問 if (hasPermission(roles, tmp)) { // 如果當前路由還有子路由 if (tmp.children) { // 進行遞歸處理 tmp.children = filterAsyncRoutes(tmp.children, roles) } // 將可訪問路由放入數(shù)組中 res.push(tmp) } }) // 返回 return res } // 為什么要寫這里呢,因為后面的Sidebar組件與這個環(huán)環(huán)相扣 const mutations = { SET_ROUTES: (state, routes) => { // 添加的路由 state.addRoutes = routes // 將vuex中的路由進行更新 state.routes = constantRoutes.concat(routes) } } const actions = { generateRoutes({ commit }, roles) { return new Promise(resolve => { let accessedRoutes // 如果roles包含 'admin' 直接可以全部訪問 if (roles.includes('admin')) { accessedRoutes = asyncRoutes || [] } else { // 利用 filterAsyncRoutes 過濾出可訪問的路由 accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) } // 保存可訪問的路由到store中 commit('SET_ROUTES', accessedRoutes) // 將可訪問路由返回 resolve(accessedRoutes) }) } }
generateRoutes就是根據(jù)得到的用戶權限生成可以訪問的路由。
動態(tài)路由實現(xiàn)
router.addRoutes(accessRoutes)
思維流程圖
替換接口實現(xiàn)登錄
第一步替換接口,這里有三個接口,建議一個一個改
第二步,將mock數(shù)據(jù)注釋掉
第三步,修改環(huán)境配置
第四步,啟動項目之后查看eg:登錄接口返回數(shù)據(jù)的格式
如果你不想改那就必須與后端協(xié)商將接口返回數(shù)據(jù)格式與原有接口數(shù)據(jù)結構返回一模一樣(特別重要的一點),如果一模一樣點擊登錄就會跳轉。(成功)
如果接口已經(jīng)寫好,那就必須修改以下的文件,格式對不上不僅影響功能,控制臺也會報錯
格式與原有格式返回不同需要修改的文件
1.切入點,先找到登錄接口,所以從user/login開始查找
返回res相關的登錄,獲取用戶信息,退出登錄接口,commit方法傳的值很可能傳錯,token的值都需要控制臺輸出一下判斷正確,以及邏輯傳參是否丟失
這里是修改之后的,包括其他相關接口返回都需要修改
request.js響應code碼根據(jù)接口返回情況進行判斷
替換接口遇到的問題
報錯原因:
項目中使用的是Element UI消息提示Message:import { Message } from ‘element-ui’;
請求響應攔截器中err處理的代碼錯誤:
Message.error(response.data.data|| "出現(xiàn)錯誤,請稍后再試");//寫法錯誤,
解決方法:
Message.error({ message: response.data.data || "出現(xiàn)錯誤,請稍后再試" }) 或 Message({ type:'error', message: response.data.data || "出現(xiàn)錯誤,請稍后再試" })
如果改完之后發(fā)現(xiàn)還報錯,也可能是改完登錄接口,沒改用戶信息接口,用戶信息接口(或是其他)報錯引發(fā)的
到此這篇關于vue-element-admin下載到登錄的一些坑的文章就介紹到這了,更多相關vue-element-admin下載到登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue cli3.0 引入eslint 結合vscode使用
這篇文章主要介紹了vue cli3.0 引入eslint 結合vscode使用,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05使用vue-cli+webpack搭建vue開發(fā)環(huán)境的方法
這篇文章主要介紹了使用vue-cli+webpack搭建vue開發(fā)環(huán)境的方法,需要的朋友可以參考下2017-12-12Vue.js 實現(xiàn)數(shù)據(jù)展示全部和收起功能
這篇文章主要介紹了Vue.js 實現(xiàn)數(shù)據(jù)展示全部和收起功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09vue中beforeRouteLeave實現(xiàn)頁面回退不刷新的示例代碼
這篇文章主要介紹了vue中beforeRouteLeave實現(xiàn)頁面回退不刷新的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11