久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

動態加載權限管理模塊中的Vue組件

本文我們主要來聊聊登錄以及組件的動態加載。

創新互聯公司主營奎文網站建設的網絡公司,主營網站建設方案,成都app開發,奎文h5微信小程序開發搭建,奎文網站營銷推廣歡迎奎文等地區企業咨詢

登錄狀態保存

當用戶登錄成功之后,需要將當前用戶的登錄信息保存在本地,方便后面使用。具體實現如下:

登錄成功保存數據

在登錄操作執行成功之后,通過commit操作將數據提交到store中,核心代碼如下:

this.postRequest('/login', {
  username: this.loginForm.username,
  password: this.loginForm.password
}).then(resp=> {
  if (resp && resp.status == 200) {
  var data = resp.data;
  _this.$store.commit('login', data.msg);
  var path = _this.$route.query.redirect;
  _this.$router.replace({path: path == '/' || path == undefined ? '/home' : path});
  }
});

store

store的核心代碼如下:

export default new Vuex.Store({
 state: {
  user: {
   name: window.localStorage.getItem('user' || '[]') == null ? '未登錄' : JSON.parse(window.localStorage.getItem('user' || '[]')).name,
   userface: window.localStorage.getItem('user' || '[]') == null ? '' : JSON.parse(window.localStorage.getItem('user' || '[]')).userface
  }
 },
 mutations: {
  login(state, user){
   state.user = user;
   window.localStorage.setItem('user', JSON.stringify(user));
  },
  logout(state){
   window.localStorage.removeItem('user');
  }
 }
});

為了減少麻煩,用戶登錄成功后的數據將被保存在localStorage中(防止用戶按F5刷新之后數據丟失),以字符串的形式存入,取的時候再轉為json。當用戶注銷登陸時,將localStorage中的數據清除。

組件動態加載

在權限管理模塊中,這算是前端的核心了。

核心思路

用戶在登錄成功之后,進入home主頁之前,向服務端發送請求,要求獲取當前的菜單信息和組件信息,服務端根據當前用戶所具備的角色,以及角色所對應的資源,返回一個json字符串,格式如下:

[
  {
    "id": 2,
    "path": "/home",
    "component": "Home",
    "name": "員工資料",
    "iconCls": "fa fa-user-circle-o",
    "children": [
      {
        "id": null,
        "path": "/emp/basic",
        "component": "EmpBasic",
        "name": "基本資料",
        "iconCls": null,
        "children": [],
        "meta": {
          "keepAlive": false,
          "requireAuth": true
        }
      },
      {
        "id": null,
        "path": "/emp/adv",
        "component": "EmpAdv",
        "name": "高級資料",
        "iconCls": null,
        "children": [],
        "meta": {
          "keepAlive": false,
          "requireAuth": true
        }
      }
    ],
    "meta": {
      "keepAlive": false,
      "requireAuth": true
    }
  }
]

前端在拿到這個字符串之后,做兩件事:1.將json動態添加到當前路由中;2.將數據保存到store中,然后各頁面根據store中的數據來渲染菜單。

核心思路并不難,下面我們來看看實現步驟。

數據請求時機

這個很重要。

可能會有小伙伴說這有何難,登錄成功之后請求不就可以了嗎?是的,登錄成功之后,請求菜單資源是可以的,請求到之后,我們將之保存在store中,以便下一次使用,但是這樣又會有另外一個問題,假如用戶登錄成功之后,點擊某一個子頁面,進入到子頁面中,然后按了一下F5進行刷新,這個時候就GG了,因為F5刷新之后store中的數據就沒了,而我們又只在登錄成功的時候請求了一次菜單資源,要解決這個問題,有兩種思路:1.將菜單資源不要保存到store中,而是保存到localStorage中,這樣即使F5刷新之后數據還在;2.直接在每一個頁面的mounted方法中,都去加載一次菜單資源。

由于菜單資源是非常敏感的,因此最好不要不要將其保存到本地,故舍棄方案1,但是方案2的工作量有點大,因此我采取辦法將之簡化,采取的辦法就是使用路由中的導航守衛。

路由導航守衛

我的具體實現是這樣的,首先在store中創建一個routes數組,這是一個空數組,然后開啟路由全局守衛,如下:

router.beforeEach((to, from, next)=> {
  if (to.name == 'Login') {
   next();
   return;
  }
  var name = store.state.user.name;
  if (name == '未登錄') {
   if (to.meta.requireAuth || to.name == null) {
    next({path: '/', query: {redirect: to.path}})
   } else {
    next();
   }
  } else {
   initMenu(router, store);
   next();
  }
 }
)

這里的代碼很短,我來做一個簡單的解釋:

1.如果要去的頁面是登錄頁面,這個沒啥好說的,直接過。

2.如果不是登錄頁面的話,我先從store中獲取當前的登錄狀態,如果未登錄,則通過路由中meta屬性的requireAuth屬性判斷要去的頁面是否需要登錄,如果需要登錄,則跳回登錄頁面,同時將要去的頁面的path作為參數傳給登錄頁面,以便在登錄成功之后跳轉到目標頁面,如果不需要登錄,則直接過(事實上,本項目中只有Login頁面不需要登錄);如果已經登錄了,則先初始化菜單,再跳轉。

初始化菜單的操作如下:

export const initMenu = (router, store)=> {
 if (store.state.routes.length > 0) {
  return;
 }
 getRequest("/config/sysmenu").then(resp=> {
  if (resp && resp.status == 200) {
   var fmtRoutes = formatRoutes(resp.data);
   router.addRoutes(fmtRoutes);
   store.commit('initMenu', fmtRoutes);
  }
 })
}
export const formatRoutes = (routes)=> {
 let fmRoutes = [];
 routes.forEach(router=> {
  let {
   path,
   component,
   name,
   meta,
   iconCls,
   children
  } = router;
  if (children && children instanceof Array) {
   children = formatRoutes(children);
  }
  let fmRouter = {
   path: path,
   component(resolve){
    if (component.startsWith("Home")) {
     require(['../components/' + component + '.vue'], resolve)
    } else if (component.startsWith("Emp")) {
     require(['../components/emp/' + component + '.vue'], resolve)
    } else if (component.startsWith("Per")) {
     require(['../components/personnel/' + component + '.vue'], resolve)
    } else if (component.startsWith("Sal")) {
     require(['../components/salary/' + component + '.vue'], resolve)
    } else if (component.startsWith("Sta")) {
     require(['../components/statistics/' + component + '.vue'], resolve)
    } else if (component.startsWith("Sys")) {
     require(['../components/system/' + component + '.vue'], resolve)
    }
   },
   name: name,
   iconCls: iconCls,
   meta: meta,
   children: children
  };
  fmRoutes.push(fmRouter);
 })
 return fmRoutes;
}

在初始化菜單中,首先判斷store中的數據是否存在,如果存在,說明這次跳轉是正常的跳轉,而不是用戶按F5或者直接在地址欄輸入某個地址進入的。否則就去加載菜單。拿到菜單之后,首先通過formatRoutes方法將服務器返回的json轉為router需要的格式,這里主要是轉component,因為服務端返回的component是一個字符串,而router中需要的卻是一個組件,因此我們在formatRoutes方法中動態的加載需要的組件即可。數據格式準備成功之后,一方面將數據存到store中,另一方面利用路由中的addRoutes方法將之動態添加到路由中。

菜單渲染

最后,在Home頁中,從store中獲取菜單json,渲染成菜單即可,相關代碼可以在Home.vue中查看,不贅述。

OK,如此之后,不同用戶登錄成功之后就可以看到不同的菜單了。

文章題目:動態加載權限管理模塊中的Vue組件
網頁網址:http://www.js-pz168.com/article16/ihidgg.html

成都網站建設公司_創新互聯,為您提供微信公眾號、響應式網站、小程序開發、營銷型網站建設網站營銷、全網營銷推廣

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
亚洲午夜久久久久久久久久久| 成人在线视频首页| 成人黄色国产精品网站大全在线免费观看 | 日日摸夜夜添夜夜添精品视频 | 91麻豆免费看片| 日韩一区不卡| 日韩亚洲欧美综合| 亚洲精品乱码久久久久久日本蜜臀| 老司机一区二区| 北条麻妃高清一区| 色噜噜久久综合| 欧美精彩视频一区二区三区| 视频一区视频二区在线观看| eeuss影院一区二区三区| 天堂av一区二区| 欧美xxxxx裸体时装秀| 一区二区三区波多野结衣在线观看| 精品一区二区三区久久| 精品国产乱码久久久久久久软件| 欧美中文字幕一区二区三区| 亚洲激情一区二区| 日韩欧美国产1| 亚洲一区二区三区四区在线观看| 国产精品1区2区| 日本日本精品二区免费| 精品少妇一区二区三区日产乱码| 亚洲国产裸拍裸体视频在线观看乱了| 成人不卡免费av| 色综合色综合色综合| 国产日韩在线不卡| 韩国av一区二区三区四区| 久久综合中文色婷婷| 日韩三级伦理片妻子的秘密按摩| 亚洲一级在线观看| 91在线观看美女| 在线观看视频一区| 亚洲情趣在线观看| 成人免费三级在线| 色屁屁一区二区| 最新久久zyz资源站| 懂色av一区二区夜夜嗨| 亚洲成人午夜在线| 欧美激情艳妇裸体舞| 国产一区二区三区高清播放| 日韩成人av网站| 久久九九久久九九| 国产一区二区女| 亚洲午夜精品福利| 国产精品久久久久久亚洲伦| 国产成a人无v码亚洲福利| 亚洲在线播放电影| 亚洲欧洲99久久| 成人avav在线| 欧美巨大另类极品videosbest| 亚洲综合久久久| 国产伦精品一区二区三区高清版 | 日本一区二区三区四区| 国产精品影视天天线| 日本一区不卡| 1000部国产精品成人观看| 91国偷自产一区二区三区观看 | 欧美精品久久99| 亚洲成av人**亚洲成av**| 国产精品v欧美精品v日韩| 91精品国产色综合久久久蜜香臀| 三级影片在线观看欧美日韩一区二区 | 亚洲一区二区免费视频| 一区在线中文字幕| 成人av电影免费在线播放| 欧美日韩国产中文| 石原莉奈在线亚洲三区| 日韩av电影免费在线观看| 国产日韩欧美高清在线| 成人免费av资源| 91精品欧美福利在线观看| 麻豆精品一区二区三区| 1卡2卡3卡精品视频| 69堂亚洲精品首页| 奇米精品一区二区三区在线观看 | 亚洲精品日韩专区silk| 91亚洲精品乱码久久久久久蜜桃| 欧美一级搡bbbb搡bbbb| 黑人巨大精品欧美黑白配亚洲| 一区二区三区免费看| 亚洲图片欧美色图| 日本一区视频在线观看| 亚洲免费av网站| 久久久亚洲综合网站| 成人欧美一区二区三区小说| 国产精品福利视频| 国产欧美日韩麻豆91| 99久久精品久久久久久清纯| 日韩欧美国产一区二区在线播放 | 国产视频一区二区不卡| 国产午夜精品美女毛片视频| 99精品视频一区二区三区| 精品国产精品一区二区夜夜嗨| 国产91丝袜在线观看| 91精品国产麻豆国产自产在线| 国产一区二区主播在线| 欧美日韩国产在线播放网站| 激情综合亚洲精品| 欧美日韩视频专区在线播放| 久久66热偷产精品| 欧美日韩免费一区二区三区视频| 精品在线播放午夜| 欧美男男青年gay1069videost| 韩国女主播一区| 7777精品伊人久久久大香线蕉 | 欧美另类久久久品| 国产精品影视在线| 日韩亚洲欧美在线| av在线播放成人| 国产嫩草影院久久久久| 国产精品一区二区av| 亚洲男女毛片无遮挡| 日本高清久久一区二区三区| 亚洲午夜精品在线| 中文字幕一区二区三区精彩视频| 青青草97国产精品免费观看无弹窗版| 在线精品观看国产| 国产一区二区精品久久| 日韩女优电影在线观看| 91在线视频官网| 国产精品久久影院| 日本午夜精品一区二区三区| 天堂久久久久va久久久久| 在线观看www91| 国产黄色精品网站| 久久久久久久久久久久久女国产乱| 成人h在线播放| 亚洲精品日韩一| 色婷婷激情综合| 国产成人自拍网| 久久精品亚洲乱码伦伦中文| 国产私拍一区| 亚洲成av人片一区二区梦乃| 在线精品视频一区二区三四| 国产高清一区日本| 国产欧美日韩卡一| 欧美在线日韩精品| 麻豆精品在线播放| 欧美精品一区二区在线播放 | 中文字幕久久综合| 国产精品主播直播| 欧美精彩视频一区二区三区| 日韩成人av电影在线| 久久66热re国产| 久久久五月婷婷| 欧美亚洲国产免费| 麻豆91精品视频| 久久婷婷成人综合色| 蜜桃成人免费视频| 老司机精品视频一区二区三区| 日韩精品专区在线影院重磅| 国模精品娜娜一二三区| 日韩精品电影在线观看| 日韩一区二区三区视频| 精品毛片久久久久久| 日韩av中文字幕一区二区三区 | 中文字幕在线亚洲精品| 国产不卡在线一区| 国产精品国产精品国产专区不蜜 | 久久美女艺术照精彩视频福利播放| 免费成人看片网址| 极品尤物av久久免费看| 国产欧美日韩中文久久| 在线精品亚洲一区二区| 成人av免费在线播放| 一区二区三区av电影| 91精品国产免费| 久久久久一区二区| 国产在线视频不卡二| 国产精品久久久久久久蜜臀| 色狠狠桃花综合| 91原创国产| 日本成人中文字幕| 久久精品亚洲精品国产欧美kt∨| 亚洲欧洲精品在线观看| 成人激情图片网| 亚洲大片在线观看| 精品福利在线导航| 亚洲一区在线免费| 99久久婷婷国产精品综合| 亚洲a一区二区| 久久久青草青青国产亚洲免观| 亚洲精品久久久久久一区二区| 成人性视频免费网站| 亚洲国产日韩a在线播放| 精品国产乱码久久久久久免费| 先锋在线资源一区二区三区| 不卡一区二区三区四区| 婷婷六月综合亚洲| 国产日韩欧美电影| 欧美性受极品xxxx喷水| 国产在线精品一区二区三区| 国产酒店精品激情| 亚洲最新视频在线播放| 精品久久久三级丝袜| 色综合久久中文字幕|