vue vuex vue-rouert后臺(tái)項(xiàng)目——權(quán)限路由(適合初學(xué))
項(xiàng)目地址: vue-simple-template
共三個(gè)角色:adan barbara carrie 密碼全是:123456
adan 擁有 最高權(quán)限A 他可以看到 red , yellow 和 blue 頁(yè)面(共三個(gè)頁(yè)面)
barbara 擁有 權(quán)限B 他可以看到 red 和 yellow 頁(yè)面
carrie 擁有 權(quán)限C 他可以看到 red 和 blue 頁(yè)面
技術(shù)棧
webpack ---- 打包神器 vue ---- JavaScript 框架 vuex ---- 實(shí)現(xiàn)不同組件間的狀態(tài)共享 vue-router ---- 頁(yè)面路由 babel-polyfill ---- 將ES6代碼轉(zhuǎn)為ES5代碼 normalize.css ---- 重置掉該重置的樣式 element-ui ---- UI組件庫(kù)
項(xiàng)目初始化
# cd 到項(xiàng)目文件夾 cd weven-simple-template # 安裝依賴 (本項(xiàng)目還安裝了其他依賴詳情 請(qǐng)見(jiàn) package.json 文件) npm install # 運(yùn)行項(xiàng)目 npm run dev
項(xiàng)目結(jié)構(gòu)
vue-cil 腳手架初始化項(xiàng)目后,我只修改過(guò)src文件夾
src ├── App.vue ---- 頁(yè)面入口 ├── api ---- api請(qǐng)求 │ └── login.js ---- 模擬json對(duì)象數(shù)據(jù) ├── assets ---- 主題 字體等靜態(tài)資源 │ └── logo.png ├── components ---- 組件 │ ├── index.vue │ └── login.vue ├── main.js ---- 初始化組件 加載路由 ├── router ---- 路由 │ └── index.js └── store ---- vuex狀態(tài)管理 ├── getters.js ├── index.js └── modules └── login.js
重點(diǎn):
動(dòng)態(tài)路由的關(guān)鍵在于router配置的 meta字段 和vuex的 狀態(tài)共存 (不懂可以先查看官方文檔)
router/index.js
// 初始化路由 export default new Router({ routes: [ { path: '/login', name: 'Login', component: Login } ] }); // 動(dòng)態(tài)路由 meta 定義了role export const powerRouter =[ { path: '/',redirect:'/red', name: 'index',component: Index,hidden:false, children: [ { path: '/red', name: 'red', component: red,}, { path: '/yellow', name: 'yellow', component: yellow, meta: {role: 'B'}}, { path: '/blue', name: 'blue', component: blue, meta: {role: 'C'}} ] } ];
store/modules/lo
Logins({ commit }, info){ return new Promise((resolve, reject) => { let data={}; loginByUserInfo.map(function (item) { //獲取所以用戶信息 if(info.username === item.username || info.pew === item.pew){ commit('SET_USERNAME',item.username); //將username和role進(jìn)行存儲(chǔ) sessionStorage.setItem('USERNAME', item.username); //存入 session commit('SET_ROLE',item.role); sessionStorage.setItem('ROLE', item.role); return data={username:item.username,introduce:item.introduce}; }else{ return data; } }); resolve(data); }).catch(error => { reject(error); }); }, Roles({ commit }, newrouter){ return new Promise((resolve, reject) => { commit('SET_NEWROUER',newrouter); //存儲(chǔ)最新路由 resolve(newrouter); }).catch(error => { reject(error); }); },
gin.js actions部分
Logins({ commit }, info){ return new Promise((resolve, reject) => { let data={}; loginByUserInfo.map(function (item) { //獲取所以用戶信息 if(info.username === item.username || info.pew === item.pew){ commit('SET_USERNAME',item.username); //將username和role進(jìn)行存儲(chǔ) sessionStorage.setItem('USERNAME', item.username); //存入 session commit('SET_ROLE',item.role); sessionStorage.setItem('ROLE', item.role); return data={username:item.username,introduce:item.introduce}; }else{ return data; } }); resolve(data); }).catch(error => { reject(error); }); }, Roles({ commit }, newrouter){ return new Promise((resolve, reject) => { commit('SET_NEWROUER',newrouter); //存儲(chǔ)最新路由 resolve(newrouter); }).catch(error => { reject(error); }); },
main.js
router.beforeEach((to, from, next) => { if(store.getters.role){ //判斷role 是否存在 if(store.getters.newrouter.length !== 0){ next() //resolve 鉤子 }else{ let newrouter if (store.getters.role == 'A') { //判斷權(quán)限 newrouter = powerRouter } else { let newchildren = powerRouter[0].children.filter(route => { if(route.meta){ if(route.meta.role == store.getters.role){ return true } return false }else{ return true } }); newrouter = powerRouter newrouter[0].children = newchildren } router.addRoutes(newrouter) //添加動(dòng)態(tài)路由 store.dispatch('Roles',newrouter).then(res => { next({ ...to }) }).catch(() => { }) } }else{ if (['/login'].indexOf(to.path) !== -1) { next() } else { next('/login') } } })
components/index.vue
// mapGetters 輔助函數(shù)僅僅是將 store 中的 getter 映射到局部計(jì)算屬性 ...mapGetters([ 'newrouter' ])
此項(xiàng)目拿去 捋清楚 vue+vuex+vue-router 的關(guān)系是沒(méi)問(wèn)題的,這可以說(shuō)的超級(jí)簡(jiǎn)單的版本,適合初學(xué)。上面的內(nèi)容說(shuō)的重點(diǎn),其實(shí)也算是項(xiàng)目的全部啦
項(xiàng)目地址: vue-simple-template
總結(jié)
以上所述是小編給大家介紹的vue vuex vue-rouert后臺(tái)項(xiàng)目——權(quán)限路由(適合初學(xué)),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Vue 指令實(shí)現(xiàn)按鈕級(jí)別權(quán)限管理功能
- 基于Vue自定義指令實(shí)現(xiàn)按鈕級(jí)權(quán)限控制思路詳解
- 詳解vue + vuex + directives實(shí)現(xiàn)權(quán)限按鈕的思路
- vue addRoutes實(shí)現(xiàn)動(dòng)態(tài)權(quán)限路由菜單的示例
- 關(guān)于Vue的路由權(quán)限管理的示例代碼
- 基于vue實(shí)現(xiàn)網(wǎng)站前臺(tái)的權(quán)限管理(前后端分離實(shí)踐)
- vue-router路由懶加載和權(quán)限控制詳解
- 詳解基于vue-router的動(dòng)態(tài)權(quán)限控制實(shí)現(xiàn)方案
- 詳解利用 Vue.js 實(shí)現(xiàn)前后端分離的RBAC角色權(quán)限管理
- 詳解VUE前端按鈕權(quán)限控制
相關(guān)文章
Vue3+script setup+ts+Vite+Volar搭建項(xiàng)目
本文主要介紹了Vue3+script setup+ts+Vite+Volar搭建項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08node.js開(kāi)發(fā)輔助工具nodemon安裝與配置詳解
node.js代碼修改后,需要重新啟動(dòng) Express 應(yīng)用,所做的修改才能生效。若之后的每次代碼修改都要重復(fù)這樣的操作,勢(shì)必會(huì)影響開(kāi)發(fā)效率,本文將詳細(xì)介紹Nodemon,它會(huì)監(jiān)測(cè)項(xiàng)目中的所有文件,一旦發(fā)現(xiàn)文件有改動(dòng),Nodemon 會(huì)自動(dòng)重啟應(yīng)用2020-02-02Vuejs入門教程之Vue生命周期,數(shù)據(jù),手動(dòng)掛載,指令,過(guò)濾器
本篇文章主要介紹了Vuejs入門教程之Vue生命周期,數(shù)據(jù),手動(dòng)掛載,指令,過(guò)濾器的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04在移動(dòng)端使用vue-router和keep-alive的方法示例
這篇文章主要介紹了在移動(dòng)端使用vue-router和keep-alive的方法示例,vue-router與keep-alive提供的路由體驗(yàn)與移動(dòng)端是有一定差別的,感興趣的小伙伴們可以參考一下2018-12-12關(guān)于Vite不能使用require問(wèn)題的解決方法
在vue2中我們通常會(huì)在模板中通過(guò)三目運(yùn)算符和require來(lái)實(shí)現(xiàn)動(dòng)態(tài)圖片,下面這篇文章主要給大家介紹了關(guān)于Vite不能使用require問(wèn)題的解決方法,需要的朋友可以參考下2022-10-10