欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

權(quán)限管理模塊中動態(tài)加載Vue組件怎么實現(xiàn)

本篇內(nèi)容介紹了“權(quán)限管理模塊中動態(tài)加載Vue組件怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為嘉善企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),嘉善網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

登錄狀態(tài)保存

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

登錄成功保存數(shù)據(jù)

在登錄操作執(zhí)行成功之后,通過commit操作將數(shù)據(jù)提交到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');
    }
  }
});

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

組件動態(tài)加載

在權(quán)限管理模塊中,這算是前端的核心了。

核心思路

用戶在登錄成功之后,進入home主頁之前,向服務(wù)端發(fā)送請求,要求獲取當前的菜單信息和組件信息,服務(wù)端根據(jù)當前用戶所具備的角色,以及角色所對應(yīng)的資源,返回一個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動態(tài)添加到當前路由中;2.將數(shù)據(jù)保存到store中,然后各頁面根據(jù)store中的數(shù)據(jù)來渲染菜單。

核心思路并不難,下面我們來看看實現(xiàn)步驟。

數(shù)據(jù)請求時機

這個很重要。

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

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

路由導(dǎo)航守衛(wèi)

我的具體實現(xiàn)是這樣的,首先在store中創(chuàng)建一個routes數(shù)組,這是一個空數(shù)組,然后開啟路由全局守衛(wèi),如下:

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中獲取當前的登錄狀態(tài),如果未登錄,則通過路由中meta屬性的requireAuth屬性判斷要去的頁面是否需要登錄,如果需要登錄,則跳回登錄頁面,同時將要去的頁面的path作為參數(shù)傳給登錄頁面,以便在登錄成功之后跳轉(zhuǎn)到目標頁面,如果不需要登錄,則直接過(事實上,本項目中只有Login頁面不需要登錄);如果已經(jīng)登錄了,則先初始化菜單,再跳轉(zhuǎn)。

初始化菜單的操作如下:

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

菜單渲染

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

“權(quán)限管理模塊中動態(tài)加載Vue組件怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)站名稱:權(quán)限管理模塊中動態(tài)加載Vue組件怎么實現(xiàn)
分享地址:http://aaarwkj.com/article4/pcsoie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、云服務(wù)器、商城網(wǎng)站品牌網(wǎng)站設(shè)計、定制網(wǎng)站網(wǎng)站建設(shè)

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)
国产精品成人免费久久黄| 成年人网站一级黄色免费| 国产精品又大又黑又长又粗| 亚洲精品天堂av免费看| 午夜精品国产日韩欧美在线 | 亚洲区一区二区三区精品| 97视频在线免费播放| 欧美偷拍一区二区三区| 欧美黄片高清免费播放| 亚洲人成网站18禁止人| 国产精品97久久97久久久久| 女同蝴蝶在线看完整版| 日韩美女搞黄色的网站| 亚洲国产日韩精品自拍av| 亚洲av第一区国产精品| 欧美亚日韩精品视频| 亚洲av毛片在线免费播放| 欧美口爆吞精在线观看| av黄色成人在线观看| 日本在线最新视频一区二区三区| 国产青草视频免观看视频| 国产一区二区黄色录像| 日产中文乱码字幕无线观看| 九九九热精品在线视频观看| 日本国产一区二区三区在线观看| 五月婷婷六月丁香俺来也| 青青青在线视频观看华人| 手机免费在线观看国产精品| 免费黄色福利网址大片| 免费在线成人av观看| 日韩av在线不卡一区二区| 国产男女乱淫一区二区三区| 亚洲品质自拍在线观看| 日本免费观看一区久久| 2020年最新国产三级网站| 18以下的人禁止看的视频| 欧美性生活真实的视频| 亚洲一区二区三区日韩欧美| 日韩在线国产精品视频| 亚洲成人不卡一区二区三区| 亚洲人妻一区二区三区久久精品|