<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關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 21:54:52
        文檔

        vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能

        vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能:•效果演示地址 項目demo展示 重要功能總結(jié) 權(quán)限功能的實現(xiàn) 權(quán)限路由思路: 根據(jù)用戶登錄的roles信息與路由中配置的roles信息進(jìn)行比較過濾,生成可以訪問的路由表,并通過router.addRoutes(store.getters.addRouters)動態(tài)添加
        推薦度:
        導(dǎo)讀vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能:•效果演示地址 項目demo展示 重要功能總結(jié) 權(quán)限功能的實現(xiàn) 權(quán)限路由思路: 根據(jù)用戶登錄的roles信息與路由中配置的roles信息進(jìn)行比較過濾,生成可以訪問的路由表,并通過router.addRoutes(store.getters.addRouters)動態(tài)添加

        •效果演示地址

        項目demo展示

        重要功能總結(jié)

        權(quán)限功能的實現(xiàn)

        權(quán)限路由思路:

         根據(jù)用戶登錄的roles信息與路由中配置的roles信息進(jìn)行比較過濾,生成可以訪問的路由表,并通過router.addRoutes(store.getters.addRouters)動態(tài)添加可訪問權(quán)限路由表,從而實現(xiàn)左側(cè)和頂欄菜單的展示。

        實現(xiàn)步驟:

        1.在router/index.js中,給相應(yīng)的菜單設(shè)置默認(rèn)的roles信息;

        如下:給"權(quán)限設(shè)置"菜單設(shè)置的權(quán)限為:meta:{roles: ['admin', 'editor']},及不同的角色都可以看到; 給其子菜單"頁面權(quán)限",設(shè)置權(quán)限為:meta:{roles: ['admin']},及表示只有"admin"可以看到該菜單; 給其子菜單"按鈕權(quán)限"設(shè)置權(quán)限為:meta:{roles: ['editor']},及表示只有"editor"可以看到該菜單。

        2.通過router.beforeEach()和router.afterEach()進(jìn)行路由過濾和權(quán)限攔截;

        代碼如下:

        // permission judge function
        function hasPermission(roles, permissionRoles) {
         if (roles.indexOf('admin') >= 0) return true // admin permission passed directly
         if (!permissionRoles) return true
         return roles.some(role => permissionRoles.indexOf(role) >= 0)
        }
        const whiteList = ['/login'] // 不重定向白名單
        
        router.beforeEach((to, from, next) => {
         NProgress.start()
         // 設(shè)置瀏覽器頭部標(biāo)題
         const browserHeaderTitle = to.meta.title
         store.commit('SET_BROWSERHEADERTITLE', {
         browserHeaderTitle: browserHeaderTitle
         })
         // 點擊登錄時,拿到了token并存入了vuex;
         if (getToken()) {
         /* has token*/
         if (store.getters.isLock && to.path !== '/lock') {
         next({
         path: '/lock'
         })
         NProgress.done()
         } else if (to.path === '/login') {
         next({ path: '/' }) // 會匹配到path:'',后面的path:'*'還沒有生成;
         NProgress.done() 
         } else {
         if (store.getters.roles.length === 0) {
         store.dispatch('GetInfo').then(res => { // 拉取用戶信息
         const roles = res.roles
         store.dispatch('GenerateRoutes', { roles }).then(() => { // 根據(jù)roles權(quán)限生成可訪問的路由表
         router.addRoutes(store.getters.addRouters) // 動態(tài)添加可訪問權(quán)限路由表
         next({ ...to, replace: true }) // hack方法 確保addRoutes已完成
         })
         }).catch((err) => {
         store.dispatch('FedLogOut').then(() => {
         Message.error(err || 'Verification failed, please login again')
         next({ path: '/' })
         })
         })
         } else {
         // 沒有動態(tài)改變權(quán)限的需求可直接next() 刪除下方權(quán)限判斷 ↓
         if (hasPermission(store.getters.roles, to.meta.roles)) {
         next()//
         } else {
         next({ path: '/401', replace: true, query: { noGoBack: true }})
         }
         }
         }
         } else {
         if (whiteList.indexOf(to.path) !== -1) {
         next()
         } else {
         // 點擊退出時,會定位到這里
         next('/login')
         NProgress.done()
         }
         }
        })
        
        router.afterEach(() => {
         NProgress.done() // 結(jié)束Progress
         setTimeout(() => {
         const browserHeaderTitle = store.getters.browserHeaderTitle
         setTitle(browserHeaderTitle)
         }, 0)
        })

        用戶點擊登錄之后的業(yè)務(wù)邏輯分析:

        1、用戶調(diào)取登錄接口,獲取到token,進(jìn)行路由跳轉(zhuǎn)到首頁;

        2、通過路由導(dǎo)航鉤子router.beforeEach((to,from,next)=>{})函數(shù)確定下一步的跳轉(zhuǎn)邏輯,如下:
        2.1、用戶已經(jīng)登錄成功并返回token值;

         2.1.1、lock 鎖屏場景; 

         2.1.2、用戶重新定位到登錄頁面; 

          2.1.3、根據(jù)用戶是否有roles信息,進(jìn)行不同的業(yè)務(wù)邏輯,如下:  

            (1)、初始情況下,用戶roles信息為空;

                通過store.dispatch('GetInfo')調(diào)取接口,獲取用戶信息;
                獲取到roles信息后,將roles,name,avatar保存到vuex;
                同時,通過store.dispatch('GenerateRoutes', { roles })去重新過濾和生成路由,并將重新生成之后的權(quán)限路由'routes'保存到vuex;
                最后,通過router.addRoutes()合并路由表;  
                如果在獲取用戶信息接口時,出現(xiàn)錯誤,則調(diào)取store.dispatch('FedLogOut')接口,返回到login頁面;
                用戶FedLogOut之后,需要情況vuex和localStorage中的token信息;         

           (2)、用戶已經(jīng)擁有roles信息;

                點擊頁面路由,通過roles權(quán)限判斷 hasPermission();
                如果用戶有該路由權(quán)限,直接跳轉(zhuǎn)對應(yīng)的頁面;如果沒有權(quán)限,則跳轉(zhuǎn)至401提示頁面;

        2.2、用戶沒有獲取到token值;

          2.2.1、如果設(shè)置了白名單用戶,則直接跳轉(zhuǎn)到相應(yīng)的頁面;反之,則跳轉(zhuǎn)至登錄頁面; 

        3、通過路由導(dǎo)航鉤子函數(shù)router.afterEach(() => {}),做收尾工作,如下:
        3.1、NProgress.done() // 結(jié)束Progress
        3.2、獲取到title并設(shè)置title;

        詳細(xì)代碼,請參考src/permission.js

        4、權(quán)限演示說明

        測試賬號:

        (1). username: admin,password: 123456;admin擁有最高權(quán)限,可以查看所有的頁面和按鈕;

        (2). username: editor,password: 123456;editor只有被賦予權(quán)限的頁面和按鈕才可以看到;

        三級導(dǎo)航菜單頂部欄展示

        如圖所示,在完成一般后臺系統(tǒng)所具有的二級導(dǎo)航菜單功能之后,我發(fā)現(xiàn)其實很多的后臺管理系統(tǒng)都有三級導(dǎo)航菜單,但是如果都把三級菜單放到左側(cè)菜單做階梯狀排列,就會顯得比較緊湊,因此我覺得把所有的三級菜單放到頂部是一個不錯的選擇。

        開發(fā)需求:點擊左側(cè)菜單,找到其對應(yīng)的菜單(頂欄菜單)排放于頂部導(dǎo)航欄;

        開發(fā)步驟:

        1、 定義頂部導(dǎo)航組件topMenu.vue;

        通過element-ui,NavMenu 導(dǎo)航菜單來進(jìn)行頂部菜單的展示,注意頂欄和側(cè)欄設(shè)置的區(qū)別;同時將其引用于頭部組件headNav.vue中;

        2、定義頂欄路由數(shù)據(jù)router/topRouter.js;

        格式如下:

        export const topRouterMap = [
         {
         'parentName':'infoShow',
         'topmenulist':[
         {
         path: 'infoShow1',
         name: 'infoShow1',
         meta: {
         title: '個人信息子菜單1',
         icon: 'fa-asterisk',
         routerType: 'topmenu'
         },
         component: () => import('@/page/fundList/moneyData')
         }
         ]
         },
         {
         'parentName':'chinaTabsList',
         'topmenulist':[
         {
         path:'chinaTabsList1',
         name:'chinaTabsList1',
         meta:{
         title:'區(qū)域投資子菜單1',
         icon:'fa-asterisk',
         routerType:'topmenu'
         },
         component: () => import('@/page/fundList/moneyData')
         }
         ]
         }
        ]

        定義topRouterMap為路由總數(shù)組;通過parentName來與左側(cè)路由建立聯(lián)系;通過topmenulist表示該頂欄路由的值;通過meta.routerType的值為"topmenu"或"leftmenu"來區(qū)分是頂欄路由,還是左側(cè)路由;

        3、 準(zhǔn)備headNav.vue中渲染數(shù)據(jù);

        思路:點擊左側(cè)菜單,需要顯示頂部對應(yīng)的菜單。因為左側(cè)菜單要和頂部菜單建立聯(lián)系。我們知道導(dǎo)航菜單在用戶登錄時,會根據(jù)用戶的role信息進(jìn)行權(quán)限過濾;那么,在過濾權(quán)限路由數(shù)據(jù)之前,我們可以通過addTopRouter()將所有的三級菜單進(jìn)行過濾添加,添加完成之后,繼續(xù)進(jìn)行角色過濾,可以保證將不具備權(quán)限的頂部菜單也過濾掉。

        // 通過循環(huán)過濾,生成新的二級菜單
        function addTopRouter(){
         asyncRouterMap.forEach( (item) => {
         if(item.children && item.children.length >= 1){
         item.children.forEach((sitem) => {
         topRouterMap.forEach((citem) => {
         if(sitem.name === citem.parentName){
         let newChildren = item.children.concat(citem.topmenulist);
         item.children = newChildren;
         }
         })
         })
         }
         })
         return asyncRouterMap;
        }

        4、點擊左側(cè)菜單過濾路由并顯示對應(yīng)數(shù)據(jù);

        在組件topMenu.vue中,用戶默認(rèn)進(jìn)來或者點擊左側(cè)菜單,觸發(fā)setLeftInnerMenu()函數(shù),如下:

         setLeftInnerMenu(){
         if(this.$route.meta.routerType == 'leftmenu'){ // 點擊的為 左側(cè)的2級菜單
         this.$store.dispatch(''ClickLeftInnerMenu,
         {'name':this.$route.name}
         );
         }else{ // 點擊頂部的菜單
         this.$store.dispatch('ClickTopMenu',
         {'title':this.$route.meta.title}
         );
         }
        }

        通過當(dāng)前路由this.$route.meta.routerType的值判斷,用戶是點擊頂部菜單還是左側(cè)菜單。如果點擊頂部菜單,通過this.$store觸發(fā)異步動作'ClickLeftInnerMenu'并傳遞參數(shù)'name',vuex中通過state.topRouters = filterTopRouters(state.routers,data)過濾當(dāng)前路由信息;代碼如下:

        // 獲取到當(dāng)前路由對應(yīng)頂部子菜單
         function filterTopRouters(data){
         let topRouters = topRouterMap.find((item)=>{
         return item.parentName === data.name
         })
         if(!mutils.isEmpty(topRouters)){
         return topRouters.topmenulist;
         }
        }

        topMenu.vue中,通過 computed:{ ...mapGetters(['topRouters'])}進(jìn)行對應(yīng)頂部路由數(shù)據(jù)的展示。用戶每次點擊左側(cè)菜單時,頂部路由都進(jìn)行了重新賦值并渲染,保證了數(shù)據(jù)的準(zhǔn)確性。

        5、頂部菜單完善;

        當(dāng)頂部菜單的數(shù)據(jù)量過大時,我們需要設(shè)置橫向滾動條并設(shè)置滾動條的樣式。
         如圖:

        mock數(shù)據(jù)詳解

        easy-mock使用

        Easy Mock介紹:

        •Easy Mock 是一個可視化,并且能快速生成 模擬數(shù)據(jù) 的持久化服務(wù),
        •Easy Mock 支持基于 Swagger 創(chuàng)建項目,以節(jié)省手動創(chuàng)建接口的時間;
        •簡單點說:Easy Mock就是一個在線創(chuàng)建mock的服務(wù)平臺,幫你省去你 配置、安裝、起服務(wù)、維護(hù)、多人協(xié)作Mock數(shù)據(jù)不互通等一系列繁瑣的操作, 它能在不用1秒鐘的時間內(nèi)給你所要的一切。

        詳細(xì)使用方法,包含新建項目,基礎(chǔ)語法,數(shù)據(jù)占位符,Swagger等介紹和使用,請參考詳細(xì)文檔

        easy-mock,在本項目中的使用:

        1.按照官方文檔,創(chuàng)建個人項目vue-touzi-admin;

        根據(jù)項目需要,創(chuàng)建的接口有:用戶登錄接口:"/user/login";獲取用戶信息接口:"/user/info";用戶登出接口:"/user/logout";獲取所有用戶列表接口:"/user/getUserList";如圖:

        登錄接口在easy-mock端編寫的邏輯如下:

        {
         code: function({
         _req
         }) {
         if (_req.body.username === "admin" || _req.body.username === "editor" && _req.body.password === "123456") {
         return 200
         } else {
         return -1
         }
         },
         message: function({
         _req
         }) {
         if (_req.body.username !== "admin" || _req.body.username !== "editor") {
         return "賬號或密碼有誤!"
         }
         },
         data: function({
         _req
         }) {
         if (_req.body.username == "admin" && _req.body.password === "123456") {
         return {
         code: 0,
         roles: ['admin'],
         token: 'admin',
         introduction: '我是超級管理員',
         name: 'Super Admin'
         }
         } else if (_req.body.username === 'editor' && _req.body.password === "123456") {
         return {
         code: 0,
         roles: ['editor'],
         token: 'editor',
         introduction: '我是編輯',
         name: 'Normal Editor'
         }
         } else {
         return "賬號或密碼有誤!"
         }
         }
        }

        1.webpack中,開發(fā)環(huán)境和生產(chǎn)環(huán)境地址配置;生產(chǎn)環(huán)境,NODE_ENV: '"production"';如下:

        module.exports = merge(prodEnv, {
         NODE_ENV: '"development"',
         API_BASE_URL: '"https://easy-mock.com/mock/5cd03667adb0973be6a3d8d1/api"',
        })

        3.接口封裝實例;如下:

        import request from '@/utils/axios'
        export function login(username, password) {
         return request({
         url: process.env.API_BASE_URL+'/user/login',
         method: 'post',
         data: {
         username,
         password
         }
         })
        }

        mockjs使用

        使用背景:

        在使用easy-mock模擬數(shù)據(jù)的過程中,發(fā)現(xiàn)其對表格固定數(shù)據(jù)不能實現(xiàn)增刪改等功能,因而選擇了使用mockjs;

        介紹及功能:

        Mock.js是一款模擬數(shù)據(jù)生成器,旨在幫助前端攻城師獨立于后端進(jìn)行開發(fā),幫助編寫單元測試。提供了以下模擬功能:

        1.根據(jù)數(shù)據(jù)模板生成模擬數(shù)據(jù),通過mockjs提供的方法,你可以輕松地創(chuàng)造大量隨機的文本,數(shù)字,布爾值,日期,郵箱,鏈接,圖片,顏色等.

        2.模擬 Ajax 請求,生成并返回模擬數(shù)據(jù),mockjs可以進(jìn)行強大的ajax攔截.能判斷請求類型,獲取到url,請求參數(shù)等.然后可以返回mock的假數(shù)據(jù),或者你自己編好的json文件.功能強大易上手.

        3.基于 HTML 模板生成模擬數(shù)據(jù)

        mockjs在本項目中使用:

        1.安裝mockjs

        npm install mockjs --save-dev

        2.創(chuàng)建mock文件夾結(jié)構(gòu)并定義相關(guān)的功能模塊;如圖:

        mockjs/index.js,負(fù)責(zé)定義相關(guān)的mock接口,如下:
        import Mock from 'mockjs'
        import tableAPI from './money'
        // 設(shè)置全局延時 沒有延時的話有時候會檢測不到數(shù)據(jù)變化 建議保留
        Mock.setup({
         timeout: '300-600'
        })
        // 資金相關(guān)
        Mock.mock(/\/money\/get/, 'get', tableAPI.getMoneyList)
        Mock.mock(/\/money\/remove/, 'get', tableAPI.deleteMoney)
        Mock.mock(/\/money\/batchremove/, 'get', tableAPI.batchremoveMoney)
        Mock.mock(/\/money\/add/, 'get', tableAPI.createMoney)
        Mock.mock(/\/money\/edit/, 'get', tableAPI.updateMoney)

        mockjs/money.js,則定義相關(guān)的函數(shù),實現(xiàn)模擬數(shù)據(jù)的業(yè)務(wù)邏輯,比如資金流水?dāng)?shù)據(jù)的增刪改查等;數(shù)據(jù)的生成規(guī)則請參照mockjs官網(wǎng)文檔,上面有詳細(xì)的語法說明;

        3.在main.js中引入定義好的mockjs;如下:

        import './mockjs'  //引用mock

        4.mockjs,api接口封裝;

        src/api/money.js中,進(jìn)行了統(tǒng)一的接口封裝,在頁面中調(diào)用對應(yīng)函數(shù),即可獲取到相應(yīng)的模擬數(shù)據(jù)。代碼如下:

        import request from '@/utils/axios'
        export function getMoneyIncomePay(params) {
         return request({
         url: '/money/get',
         method: 'get',
         params: params
         })
        }
        export function addMoney(params) {
         return request({
         url: '/money/add',
         method: 'get',
         params: params
         })
        }

        5.組件中,接口調(diào)用,獲取數(shù)據(jù),渲染頁面;

        總結(jié)

        以上所述是小編給大家介紹的vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
        如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能

        vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能:•效果演示地址 項目demo展示 重要功能總結(jié) 權(quán)限功能的實現(xiàn) 權(quán)限路由思路: 根據(jù)用戶登錄的roles信息與路由中配置的roles信息進(jìn)行比較過濾,生成可以訪問的路由表,并通過router.addRoutes(store.getters.addRouters)動態(tài)添加
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产成人精品日本亚洲专区| 免免费国产AAAAA片| 亚洲AV成人无码网天堂| 色偷偷噜噜噜亚洲男人| 国产卡一卡二卡三免费入口 | 亚洲精品国产精品| 免费人成大片在线观看播放电影| 国产精品免费观看视频| 88xx成人永久免费观看| 国产精品免费视频网站| jlzzjlzz亚洲乱熟在线播放| 一区二区三区免费在线视频| 性做久久久久久久免费看| 国产成人精品日本亚洲专| 两性色午夜视频免费播放| 91精品手机国产免费| 亚洲国产精品成人精品小说 | 亚洲私人无码综合久久网| 最好免费观看高清在线| 午夜国产大片免费观看| 亚洲国产视频一区| 岛国av无码免费无禁网站| 久久亚洲春色中文字幕久久久| 羞羞视频在线免费观看| 毛片免费在线观看网址| 亚洲天堂视频在线观看| 欧洲美女大片免费播放器视频| 在线观看亚洲精品国产| 亚洲大尺度无码无码专线一区| 亚洲国产成人久久综合一区77 | 国产精品午夜免费观看网站| 精品亚洲综合久久中文字幕| 又黄又大的激情视频在线观看免费视频社区在线 | 免费三级毛片电影片| 香港一级毛片免费看| 亚洲精品综合一二三区在线| 全免费一级毛片在线播放| 亚洲最新黄色网址| 亚洲区小说区图片区| 久久久久久久国产免费看| 久久激情亚洲精品无码?V|