2022-01-03 22:20:10 +08:00
|
|
|
import { ref } from 'vue';
|
|
|
|
import type { Ref } from 'vue';
|
|
|
|
import type { Router } from 'vue-router';
|
|
|
|
import { defineStore } from 'pinia';
|
|
|
|
import { useBoolean } from '@/hooks';
|
|
|
|
import { fetchUserRoutes } from '@/service';
|
2022-01-06 11:22:14 +08:00
|
|
|
import { transformAuthRouteToMenu, transformAuthRoutesToVueRoutes } from '@/utils';
|
2022-01-06 02:00:42 +08:00
|
|
|
import type { GlobalMenuOption } from '@/interface';
|
2022-01-03 22:20:10 +08:00
|
|
|
|
|
|
|
/** 路由状态 */
|
|
|
|
interface RouteStore {
|
|
|
|
/** 是否添加过动态路由 */
|
|
|
|
isAddedDynamicRoute: Ref<boolean>;
|
|
|
|
/** 初始化动态路由 */
|
|
|
|
initDynamicRoute(router: Router): Promise<void>;
|
2022-01-11 08:22:31 +08:00
|
|
|
/** 菜单 */
|
|
|
|
menus: Ref<GlobalMenuOption[]>;
|
2022-01-03 22:20:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export const useRouteStore = defineStore('route-store', () => {
|
2022-01-06 02:00:42 +08:00
|
|
|
const menus = ref<GlobalMenuOption[]>([]) as Ref<GlobalMenuOption[]>;
|
|
|
|
function getMenus(data: AuthRoute.Route[]) {
|
|
|
|
const transform = transformAuthRouteToMenu(data);
|
|
|
|
menus.value = transform;
|
|
|
|
}
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
const { bool: isAddedDynamicRoute, setTrue: setAddedDynamicRoute } = useBoolean();
|
|
|
|
async function initDynamicRoute(router: Router) {
|
2022-01-06 02:00:42 +08:00
|
|
|
const { data } = await fetchUserRoutes();
|
|
|
|
if (data) {
|
|
|
|
getMenus(data.routes);
|
2022-01-03 22:20:10 +08:00
|
|
|
|
2022-01-06 11:22:14 +08:00
|
|
|
const vueRoutes = transformAuthRoutesToVueRoutes(data.routes);
|
2022-01-06 02:00:42 +08:00
|
|
|
vueRoutes.forEach(route => {
|
|
|
|
router.addRoute(route);
|
|
|
|
});
|
|
|
|
|
|
|
|
setAddedDynamicRoute();
|
|
|
|
}
|
2022-01-03 22:20:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
const routeStore: RouteStore = {
|
|
|
|
isAddedDynamicRoute,
|
2022-01-11 08:22:31 +08:00
|
|
|
initDynamicRoute,
|
|
|
|
menus
|
2022-01-03 22:20:10 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
return routeStore;
|
|
|
|
});
|