vue3+element-plus ロール権限管理の割り当て

ここの写真は、この先生のプロジェクトのスクリーンショットです.
誰もが使いやすいように、各写真の下にコードをそのまま入力します.

以下を src/uitls/permission.js に追加します

このコード セクションでは、次のように説明しています:
パラメーター 1: バックグラウンドからのルート
パラメーター 2: すべてのフロントエンド ルートは、
最初にすべてのフロントエンド ルートを横断し、次にその中のバックグラウンド ルートを横断し続け、ユーザーが許可を持っているかどうかを判断しますあるキーワードが同じかどうか(ここでは教師がタイトルのキーワードを使用)によって、同じキーワードの理論を直接追加できますが、2 次または 3 次のサブコンテンツの存在を考慮して、ここでは教師が再帰的に作成しました。プロセス、つまり、現在の要素に children 属性がある場合は、現在の要素の children 属性が再帰的に処理され、最終的に返される値は現在の権限でアクセスできる値になります。

ここに画像の説明を挿入
次の内容は上の図と一致しており、簡単にコピーして使用できます

/**
* 参数1:后台传来的关键字数组,参数二:全部路由数据
*/
export function comparation(userRouter=[],allRouter=[]){
    
    
  let realRouter = []
  allRouter.forEach(item=>{
    
    
    userRouter.forEach(v=>{
    
    
      if(item.meta,title===v.title){
    
    
        //注意children
        if(item.children && item.children.length>0){
    
    
          item.children=comparation(v.children,item.children)
        }
        realRouter.push(item)
      }
    })
  })
  return realRouter
}

このコードはvuexで書かれており、基本的にコメントがあります

コードの説明: このコード ティーチャーは、ルーティング コレクション データを定義します。これは、ページに表示する必要がある実際のデータです (ここで、ティーチャーはナビゲーション メニューも使用しますが、私は使用しません。ルーティングによって直接生成されたメニューです。バックグラウンドから渡されたデータまたはフロントデスクで定義されたルーティングテーブルは人によって異なります。これは主に権限管理の考え方を理解するためのものです)、中間の突然変異はルーティングテーブルとメニューの設定と非表示を定義します。アクションのメソッドは実際のコアであり、現在のユーザーの役割リクエストを送信し、すぐ上のモジュールで定義されたメソッドを導入してユーザーの権限を設定し、最後に vuex とルーティングに追加します

ここに画像の説明を挿入
ここに画像の説明を挿入
上の 2 つの図は結合されていますが、
次の内容は上の 2 つの図と一致しており、コピーして使用するのに便利です。

import {
    
     comparsion } from "@/uitl/comparsion";
export default {
    
    
  namespaced: true,
  state: {
    
    
    routerList: null, //真正的路由
    sideBar: [], //导航菜单
  },
  mutations: {
    
    
    set_routerList(state, data) {
    
    
      state.realRouter = data;
    },
    clear_routerList(state, data) {
    
    
      state.realRouter = null;
    },
    set_sideBar(state, data) {
    
    
      state.sideBar = data;
    },
    clear_sideBar(state, data) {
    
    
      state.sideBar = [];
    },
  },
  actions: {
    
    
    async gat_routers({
     
      commit }, data) {
    
    
      //获取比对路由
      let routers = await login("/login", {
    
     username: "admin" }).then((res) => {
    
    
        return res.data.router;
      });
      //导航菜单
      commit("set_sideBar", routers[0].children);
      // 比对路由(参数一是上面后台返回的关键字数组,参数二是所有路由,需要导入)
      let realRouter = comparation(routers, allRouter);
      console.log(realRouter);
      // 存储到vuex
      commit("set_routerList", realRouter);
      // 动态添加路由
      router.addRoutes(realRouter); //这是vue2写法,vue3版本的router4版本没有addRoutes,只有addRoute
      //以下是我本人的写法(vue-router4版本只能通过循环一个一个加)
      // realRouter.forEach((item) => {
    
    
      //   router.addRoute(item);
      // });
    },
  },
};

ここで先生は前衛です

コードの説明:
ルートがジャンプするたびにロール ID を取得する (これは個人的にはお勧めしません。1: ルートが変更されるたびにリクエストを取得してルーティング テーブルを追加するのが面倒であるなど、ルーティングの親にいる(セクション 1 レベルのルーティング) onMonend ライフサイクルが call に設定されている)

ここに画像の説明を挿入
次の内容は上の図と一致しており、簡単にコピーして使用できます

router.beforeEach((to, from, next) => {
    
    
 if(!getToken()){
    
     //没有登录
  if(to.meta.token){
    
    //需要登录
    next({
    
    
      path:"/login"
    })
  }else{
    
    
    next()
  }
 }else{
    
     //登录
    //判断权限
    if(!store.state.permission.routerList){
    
    //没有路由
      //获取路由
      store.dispatch('permission/gat_routers').then(()=>{
    
    
        console.log(1000);
        next()
      })
    }
 }
})

これが先生のビデオチュートリアルです.リンクしたビデオの後半を見るだけでいいです.前は役に立たず、後半は​​コアです.

遭遇したバグ

ルーティング フロント ガードにルートを動的に追加し、ルーティング ページを更新すると、空白でページが見つからないということは、ルートが追加される前に既にルートにアクセスされていることを意味します.同時に、公式ドキュメントを参照した後、コードにヒントがあり、
ここに画像の説明を挿入
router.addRoute トリガーは、動的メニュー情報 (vuex) がルート ナビゲーション ガードに現在保存されていないことを検出することです。あとは、next()で解放し、公式プロンプトやコンソール関連の印刷情報によると、addRouterがルートを追加する前にwarnプロンプトが出てくることがわかるので、next()をnext(to)に変更してトリガーするのが解決策新しいもの ナビゲーション、この時点で、動的ルートの対応するアドレスを正しく一致させることができます。この next(to) は、ルートを追加する vuex メソッドの後に配置されます

   store.dispatch('permission/gat_routers').then(()=>{
    
    
        console.log(1000);
        next(to)  //这样可解决白屏问题
      })

おすすめ

転載: blog.csdn.net/weixin_68658847/article/details/130458638