1. 程式人生 > >Vue管理系統前端系列三登入頁和首頁及`vuex`管理登入狀態

Vue管理系統前端系列三登入頁和首頁及`vuex`管理登入狀態

[toc] ------ ## 登入頁面設計 該節記錄了登入介面的設計,以及 vuex 的簡單實用,然後將首頁簡單搭建完成。 先看最終效果圖 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200820202553562-1123138161.png) ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200820202604033-229445112.png) 先在 views 資料夾下 新建 login/index.vue 檔案。用於登入首頁 ### vuex 對應 使用者模組 `vuex` 相關介紹可參考另一篇博文,[連結](../vue/vuex.md) 新建 `store/modules/user.js`,將登入狀態及內容儲存到狀態管理器中,內容如下: ```js import router from '@/router' export default { state: { userInfo: null, //使用者資訊 token: null, }, getters: { userInfo: (state) => { if (state.userInfo == null) { let sessionUser = sessionStorage.getItem('user') if (sessionUser != null) { state.userInfo = JSON.parse(sessionUser) return sessionUser } else { let localeUser = localStorage.getItem('user') if (localeUser != null) { state.userInfo = JSON.parse(localeUser) } return localeUser } } return state.userInfo }, token: (state) => { if (state.token == null) { let sessionToken = sessionStorage.getItem('token') if (sessionToken != null) { state.token = sessionToken return sessionToken } else { let localeToken = localStorage.getItem('token') state.token = localeToken return localeToken } } return state.token }, }, mutations: { setToken(state, token, flag = true) { if (flag) { localStorage.setItem('token', token) } else { sessionStorage.setItem('token', token) } }, setUserInfo(state, userInfo, flag = true) { state.userInfo = userInfo state.token = userInfo.token if (flag) { localStorage.setItem('user', JSON.stringify(userInfo)) } else { sessionStorage.setItem('user', JSON.stringify(userInfo)) } this.commit('setToken', userInfo.token, flag) }, logout(state) { state.userInfo = null state.token = null localStorage.removeItem('token') localStorage.removeItem('user') sessionStorage.removeItem('token') sessionStorage.removeItem('user') router.push('/login') }, }, actions: {}, } ``` 然後再在 `store/index.js` 中將 user 模組引入進來,程式碼如下: ```js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) import user from './modules/user' const store = new Vuex.Store({ modules: { user: user, }, }) export default store ``` ### 豐富介面 使用 `element` 的 from 元件,進行設計登入介面。介面程式碼如下: ``` ``` 登入相關 指令碼 程式碼如下: ```js ``` 對介面進行 簡單的樣式調整,設定背景等,程式碼如下: ```css ``` 相關介面[上一篇](./utils_import.md)文章中有寫,這裡就不再贅述了。 mock 介面截圖如下, ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200820202621119-1669782723.png) 既然涉及到登入,那肯定需要進行許可權判斷,所以我們使用 路由前置守衛進行控制, - 若在除錯控制檯有報 跳轉錯誤等,可參考 [跳轉錯誤處理](../vue/vue_router.md) ```js const WhiteListRouter = ['/login', '/notfound'] // 路由白名單 //導航守衛 路由開始前 router.beforeEach((to, from, next) => { let user = store.getters.userInfo let token = store.getters.token var hasAuth = user !== null && token !== null && user !== undefined && token !== undefined if (to.path == '/login') { if (hasAuth) { next({ path: '/' }) } else { next() } } else { if (!hasAuth) { //沒登入的情況下 訪問的是否是白名單 if (WhiteListRouter.indexOf(to.path) !== -1) { next() } else { next({ path: '/login', }) } } else { next() } } }) ``` 路由相關程式碼 ```js const routes = [ { path: '/', name: 'home', component: () => import('@/views/home'), children: [ { path: '', name: '首頁', component: () => import('@/views/home/defaultPage'), }, ], }, { path: '/login', name: 'login', component: login, }, { path: '/notfound', name: 'notfound', component: () => import('@/views/notfound'), }, { path: '*', redirect: '/notfound', name: 'notfound', component: () => import('@/views/notfound'), }, ] ``` 其中涉及到的相關頁面,就只有自己建了。 ## 首頁相關程式碼 完整程式碼: ``` ``` 其中設計到了 全屏按鈕 的使用, 需要執行以下安裝命令: ```cmd npm install sreenfull --s