VueRouterのaddRoutes方法を使用して、動的にユーザを追加する権限ルートを実現します。
5216 ワード
最近では、vue単一ページのプロジェクトは、マルチキャラクターのユーザー権限の問題に関連しています。異なるキャラクターのユーザーは、異なる機能権限を持っています。
git:https://github.com/pch1024/dynamicRouter
もちろん、ログインはtoken、ユーザー情報などを取得します。私達はしばらく注目していません。私達の権限規則は多くのところで使わなければなりません。だから私達はそれをvuexに保存します。
基本的な考え方:すべてのルーティング・ジャンプは認証されます。 は、ダイナミックルーティング(すなわちデフォルトルーティング)ではなく、直接に見逃す です。は、動的なルーティングである(すなわち、まだ作成されていない、強制的に入ると404にリダイレクトされるが、それでもto.redictedFromでユーザが入ることを望むルートを取得することができる)。ルート権限規則データがあるかどうかを確認する。 はありません。登録ページ に行かせます。にあります。roleRouterRulesによって現在のキャラクターの動的なルーティング設定データを生成し、addRoutesを本当のrouterに追加します。このときlet path=to.redirected From_pathによって。とnext(path)もう一回認証してください。 はこのユーザがこのページにアクセスする権限がないということを表していません。
注意事項: addRoutes()の方法は1つのユーザが一回しか使えないので、ステータス値isAddRoutesをvuexに追加して、ユーザーが動的なルーティングに入るたびにアドドRoutesを確認して を使ったことがありません。 next()メソッドはパラメータがないと直接に放します。パラメータ(例えばnext({path:'/404')があります。)が放したら再度router.beforeEachに入ります。気をつけないと死循環 です。
ここにピットがあります。Vue RouterはaddRoutesだけを提供していますが、削除と置換方法がありません。強い更新ブラウザでVue Routerをリセットするしかないです。まず空のlocal Strageをクリアします。更新時に初期化されたVue Routerは標準ルートしかありません。ユーザーはページを登録するしかないです。
もう一つの方法が分かりませんでした。興味があります。
git:https://github.com/pch1024/dynamicRouter
:
A => 1
=> 2
=> 3
B => 1
=> 4
=> 5
第1ステップは、デフォルトのルーティングとダイナミックなルーティングを定義する。
// ( , , )
export const dynamicRouter = [
{ path: '/b', name: 'b', component: pageB },
{ path: '/c', name: 'c', component: pageC },
];
// ( )
const routes = [
{ path: '/', redirect: '/login' },
{ path: '/login', component: pageLogin},
{ path: '/404', component: page404},
{ path: '*', redirect: '/404' },
];
const router = new VueRouter({
mode: 'history',
routes, // ( ) routes: routes
});
第2ステップアクセス権限ルールもちろん、ログインはtoken、ユーザー情報などを取得します。私達はしばらく注目していません。私達の権限規則は多くのところで使わなければなりません。だから私達はそれをvuexに保存します。
// vue
<li @click="login(['b'])">
1 , ['b'], B
</li>
<li @click="login(['c'])">
2 , ['c'], B,( 2 B , gun 404)
</li>
// ---------------------------------------------------------
import { mapActions } from "vuex";
export default {
methods: {
...mapActions([
"set_roleRouterRules"
]),
login(roleRouterRules) {
// ,vuex
this.set_roleRouterRules(roleRouterRules);
// B
this.$router.replace({ path: "/b" });
}
}
};
// vuex -----------------------------------------------
// 1 dynamicRouter
import { dynamicRouter } from './router';
//
state: {
isAddRoutes: false,
// localStorage,
roleRouterRules: JSON.parse(localStorage.getItem('roleRouterRules')),
},
// =>
getters: {
isAddRoutes: state => state.isAddRoutes,
// roleRouterRules (addRoutes )
roleRouter: state => {
if (state.roleRouterRules) {
return dynamicRouter.filter(
router => state.roleRouterRules.indexOf(router.name) >= 0,
);
} else return null;
},
},
// ( ) =>
mutations: {
set_isAddRoutes: (state, data) => (state.isAddRoutes = data), // payload: true/false
set_roleRouterRules: (state, data) => (state.roleRouterRules = data), // payload: true/false
},
// ( )=>
actions: {
set_isAddRoutes({ commit }, data) {
commit('set_isAddRoutes', data);
},
set_roleRouterRules({ commit }, data) {
// vuex
commit('set_roleRouterRules', data);
// localStorage, state.roleRouterRules
localStorage.setItem('roleRouterRules', JSON.stringify(data));
},
}
第3ステップログイン成功時に権限ページを移動しました(コア)基本的な考え方:
注意事項:
import vuex from './vuex';
router.beforeEach((to, from, next) => {
let path = to.redirectedFrom || to.path;
//
if (whiteList.indexOf(path) >= 0) return next();
//
if (!vuex.getters.roleRouter) return next({ path: '/login' });
if (!vuex.getters.isAddRoutes) {
console.log('path , , ');
router.addRoutes(vuex.getters.roleRouter);
vuex.dispatch('set_isAddRoutes', true);
next(path);
} else {
console.log(' , ');
next();
}
});
第4ステップは、異なるキャラクターのユーザを切り替えます。ここにピットがあります。Vue RouterはaddRoutesだけを提供していますが、削除と置換方法がありません。強い更新ブラウザでVue Routerをリセットするしかないです。まず空のlocal Strageをクリアします。更新時に初期化されたVue Routerは標準ルートしかありません。ユーザーはページを登録するしかないです。
もう一つの方法が分かりませんでした。興味があります。
exit() {
localStorage.clear();
window.location.reload();
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。