2026-07-27 00:18:42 +08:00
|
|
|
import type { RouteLocationNormalized, RouteRecordRaw } from 'vue-router';
|
|
|
|
|
import { useUserStore } from '@/store';
|
|
|
|
|
|
|
|
|
|
export default function usePermission() {
|
|
|
|
|
const userStore = useUserStore();
|
|
|
|
|
return {
|
|
|
|
|
accessRouter(route: RouteLocationNormalized | RouteRecordRaw) {
|
|
|
|
|
return (
|
|
|
|
|
!route.meta?.requiresAuth ||
|
2026-07-27 12:48:35 +08:00
|
|
|
userStore.role === 'root' ||
|
|
|
|
|
(!route.meta?.menuCode && !route.meta?.roles) ||
|
|
|
|
|
Boolean(
|
|
|
|
|
route.meta?.menuCode &&
|
|
|
|
|
userStore.menuCodes.includes(route.meta.menuCode),
|
|
|
|
|
) ||
|
|
|
|
|
Boolean(route.meta?.roles?.includes(userStore.role))
|
2026-07-27 00:18:42 +08:00
|
|
|
);
|
|
|
|
|
},
|
2026-07-27 12:48:35 +08:00
|
|
|
findFirstPermissionRoute(_routers: any, role = userStore.role) {
|
2026-07-27 00:18:42 +08:00
|
|
|
const cloneRouters = [..._routers];
|
|
|
|
|
while (cloneRouters.length) {
|
|
|
|
|
const firstElement = cloneRouters.shift();
|
|
|
|
|
if (
|
2026-07-27 12:48:35 +08:00
|
|
|
role === 'root' ||
|
|
|
|
|
(firstElement?.meta?.menuCode &&
|
|
|
|
|
userStore.menuCodes.includes(firstElement.meta.menuCode)) ||
|
|
|
|
|
firstElement?.meta?.roles?.includes(role)
|
2026-07-27 00:18:42 +08:00
|
|
|
)
|
|
|
|
|
return { name: firstElement.name };
|
|
|
|
|
if (firstElement?.children) {
|
|
|
|
|
cloneRouters.push(...firstElement.children);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
},
|
|
|
|
|
// You can add any rules you want
|
|
|
|
|
};
|
|
|
|
|
}
|