@opentiny/tiny-toolkit-pro
Version:
TinyPro Vue:开箱即用、前后端分离的 Vue 后台管理模板
65 lines (62 loc) • 1.94 kB
text/typescript
import { getUserInfo } from '@/api/user';
import { _i18 } from '@/locale';
import { useUserStore } from '@/store';
import { useLocales } from '@/store/modules/locales';
import { Role } from '@/store/modules/user/types';
import { isLogin, setToken } from '@/utils/auth';
import NProgress from 'nprogress';
import { getCurrentInstance } from 'vue';
import { useI18n } from 'vue-i18n';
import { LocationQueryRaw, Router } from 'vue-router';
export default function setupInfoGuard(router: Router) {
router.beforeEach(async (to, from, next) => {
NProgress.start();
if (to.name === 'login') {
next();
NProgress.done();
return;
}
const userStore = useUserStore();
const localesStore = useLocales();
const { data } = (await getUserInfo()) ?? { data: null };
if (!data) {
next({
name: 'login',
query: {
redirect: to.name,
...to.query,
} as LocationQueryRaw,
});
setToken('');
NProgress.done();
return;
}
if (localesStore.shouldFetch) {
await localesStore.fetchLang();
await localesStore.fetchLocalTable();
}
if (localesStore.shouldMerge) {
const entries = Object.entries(localesStore.localTable);
for (let i = 0; i < entries.length; i += 1) {
const lang = entries[i][0];
const value = entries[i][1];
_i18?.global.mergeLocaleMessage(lang, value);
}
}
localesStore.$patch({
shouldFetch: false,
shouldMerge: false,
});
userStore.setInfo(data);
userStore.setInfo({
role: data.role[0].name,
job: data.role[0].name,
roleId: data.role[0].id,
});
userStore.rolePermission = (data.role as unknown as Role[])
.flatMap((role) => role.permission)
.map((permission) => permission.name);
next();
NProgress.done();
});
}